#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
Created on 2022-03-31 11:46:45
@author: DengLibin 榆霖
@description: k 近邻算法
'''

import operator

import numpy as np


def classify0(inx, data_set, labels, k):
    """k-近邻算法 计算输入向量所属类别(label)

    Args:
        inx (_type_): 输入向量
        data_set (_type_): 训练样本集
        labels (_type_): 标签向量
        k (_type_): 最近邻居数量
    """
    # 数据集数量（行数）
    data_size = data_set.shape[0]
    # tile：把输入向量inx进行平铺(data_size行， 1列) 再减去data_set
    diff_mat = np.tile(inx, (data_size, 1)) - data_set
    # 平方
    sq_diff_mat = diff_mat ** 2 
    # 平方和 
    sq_distances = sq_diff_mat.sum(axis=1)
    # 开平方 得到输入向量与数据集中每个向量的距离
    distances = sq_distances**0.5
    # print("distances", distances)
    # 对距离排序,取索引
    sorted_dist_indecies = distances.argsort()
    # 保存每个label的得票数
    class_count = {}
    
    # 取距离最近的前k个对应的lable
    for i in range(k):
        vote_label = labels[sorted_dist_indecies[i]]
        # 当前label得票数，同一个label得票数累加
        class_count[vote_label] = class_count.get(vote_label, 0) + 1
    
    #按得票排序 从高到低 
    sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)
    # 返回第一个的label
    return sorted_class_count[0][0]
